/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package documentadorrepositorio.descritoresArtefatos;

import documentadorrepositorio.artefatos.Artefato;
import documentadorrepositorio.interfaceGrafica.PrincipalIG;
import documentadorrepositorio.repositorio.AnalisadorRepositorio;
import documentadorrepositorio.util.IOUtil;
import java.awt.Component;
import java.util.List;
/**
 *
 * @author André
 */
import java.io.File;
import java.io.IOException;
import javax.swing.JPanel;

public abstract class DescritorArtefato {

    private List<String> listaPadroesPastas;
    private List<String> listaPadroesArquivos;
    private String nomeArquivoDescritorPasta;
    private String nomeArquivoDescritorArquivo;
    private String sigla;

    public DescritorArtefato(String descritorPastas, String descritorArquivos) throws IOException {
        nomeArquivoDescritorPasta = descritorPastas;
        nomeArquivoDescritorArquivo = descritorArquivos;
        leDescritorPasta(descritorPastas);
        leDescritorArquivo(descritorArquivos);
    }

    public abstract void destroiInstancia();

    public String getNomeArquivoDescritorArquivo() {
        return nomeArquivoDescritorArquivo;
    }

    public String getNomeArquivoDescritorPasta() {
        return nomeArquivoDescritorPasta;
    }

    public abstract String obtemTipoArtefato();

    public List<String> getlistaPadroesPastas() {
        return listaPadroesPastas;
    }

    public List<String> getListaPadroesArquivos() {
        return listaPadroesArquivos;
    }

    protected abstract void criaDescritorPasta() throws IOException;

    protected abstract void criaDescritorArquivo() throws IOException;

    public Artefato obtemDadosArtefato(String nomeArquivo) {
        Artefato artefato = obtemInstancia();
        artefato.setNumeroArtefato(DescritorUtil.obtemNumeroArtefato(artefato.getSiglaArtefato().toLowerCase(), nomeArquivo.toLowerCase()));
        artefato.setNomeArtefato(DescritorUtil.obtemNomeArtefato(artefato.getSiglaArtefato(), nomeArquivoSemExtensao(nomeArquivo)));
        return artefato;
    }

    protected String nomeArquivoSemExtensao(String nomeArquivo) {
        return nomeArquivo.replace(".txt", "").replace(".TXT", "").replace(".jpg", "").replace(".JPG", "").replace(".jpeg", "").replace(".JPEG", "");
    }

    public String getSigla() {
        return sigla;
    }

    public Boolean nomePastaAtendeAoPadrao(String nomePasta) {
        for (String padrao : this.listaPadroesPastas) {
            if (nomePasta.toLowerCase().matches(padrao)) {
                return true;
            }
        }
        return false;
    }

    protected boolean extensaoValida(String nomeArquivo) {
        return nomeArquivo.endsWith("txt") || nomeArquivo.endsWith("jpg") || nomeArquivo.endsWith("jpeg");
    }

    public Boolean nomeArquivoAtendeAoPadrao(String nomeArquivo) {
        if (extensaoValida(nomeArquivo)) {
            for (String padrao : this.listaPadroesArquivos) {
                if (nomeArquivo.toLowerCase().matches(padrao)) {
                    return true;
                }
            }
        }
        return false;
    }

    protected abstract Artefato obtemInstancia();

    private void leDescritorPasta(String descritorPastas) throws IOException {
        File arquivoDescritor = new File(descritorPastas);

        if (!arquivoDescritor.exists()) {
            criaDescritorPasta();
        }

        listaPadroesPastas = IOUtil.obtemConteudoArquivoTexto(arquivoDescritor);
    }

    private void leDescritorArquivo(String descritorArquivos) throws IOException {

        File arquivoDescritor = new File(descritorArquivos);

        if (!arquivoDescritor.exists()) {
            criaDescritorArquivo();
        }

        List<String> conteudoArquivo = IOUtil.obtemConteudoArquivoTexto(arquivoDescritor);

        //primeira linha é a sigla do artefato
        sigla = conteudoArquivo.get(0);
        listaPadroesArquivos = conteudoArquivo.subList(1, conteudoArquivo.size());
    }

    public abstract void instanciarTela(AnalisadorRepositorio analisadorRepositorio, DescritorArtefato descritorArtefato, PrincipalIG frame);
}
